#include"comm.h"
#include<iostream>

using namespace std;
//server
// int main()
// {
//     umask(0);
//     if (mkfifo(FILE_NAME, 0666) < 0)
//     {
//         perror("fifo error!");
//         return 1;
//     }

//     // code
//     int fd = open(FILE_NAME, O_RDONLY, 0666);
//     if(fd < 0)
//     {
//         perror("server open fail!");
//         return 2;
//     } 

//     char mess[128];
//     while(1)
//     {
//         mess[0] = '\0';
//         ssize_t s = read(fd, mess, sizeof(mess)-1);
//         if(s > 0)
//         {
//             mess[s] = '\0';
//             cout << "clien call# " << mess << endl;
//         }
//         else if(s == 0)
//         {
//             cout << "read end!" << endl;
//             break;
//         }
//         else
//         {
//             cout << "read fail!";
//             break;
//         }
//     }
//     close(fd);
//     return 0;
// }

// int main()
// {
//     umask(0);
//     if (mkfifo(FILE_NAME, 0666) < 0)
//     {
//         perror("fifo error!");
//         return 1;
//     }

//     // code
//     int fd = open(FILE_NAME, O_RDONLY, 0666);
//     if(fd < 0)
//     {
//         perror("server open fail!");
//         return 2;
//     } 

//     char mess[128];
//     while(1)
//     {
//         mess[0] = '\0';
//         ssize_t s = read(fd, mess, sizeof(mess)-1);
//         if(s > 0)
//         {
//            mess[s] = '\0';
//            cout << "client enter#" << endl;
//            char lable[] = "+-*/%";
//            char *p = mess;
//            int flag = 0;
//            while(*p)
//            {
//             switch(*p)
//             {
//                 case '+':
//                     flag = 0;
//                     break;
//                 case '-':
//                     flag = 1;
//                     break;
//                 case '*':
//                     flag = 2;
//                     break;
//                 case '/':
//                     flag = 3;
//                     break;
//                 case '%':
//                     flag = 4;
//                     break;
           
//             }
//              p++;
//            }
//             char* data1 = strtok(mess, "+-*/%");
// 			char* data2 = strtok(NULL, "+-*/%");
// 			int num1 = atoi(data1);
// 			int num2 = atoi(data2);
// 			int ret = 0;
// 			switch (flag)
//             {
// 			case 0:
// 				ret = num1 + num2;
// 				break;
// 			case 1:
// 				ret = num1 - num2;
// 				break;
// 			case 2:
// 				ret = num1 * num2;
// 				break;
// 			case 3:
// 				ret = num1 / num2;
// 				break;
// 			case 4:
// 				ret = num1 % num2;
// 				break;
// 			}
// 			printf("%d %c %d = %d\n", num1, lable[flag], num2, ret);
           
//         }
//         else if(s == 0)
//         {
//             cout << "client quit!" << endl;
//             break;
//         }
//         else
//         {
//             cout << "read fail!";
//             break;
//         }
//     }
//     close(fd);
//     return 0;
// }


int main()
{
    umask(0); //将文件默认掩码设置为0
	if (mkfifo(FILE_NAME, 0666) < 0){ //使用mkfifo创建命名管道文件
		perror("mkfifo");
		return 1;
	}
	int fd = open(FILE_NAME, O_RDONLY); //以读的方式打开命名管道文件
	if (fd < 0){
		perror("open");
		return 2;
	}
	char msg[128];
	while (1){
		msg[0] = '\0'; //每次读之前将msg清空
		//从命名管道当中读取信息
		ssize_t s = read(fd, msg, sizeof(msg)-1);
		if (s > 0)
        {
            msg[s] = '\0'; //手动设置'\0'，便于输出
			printf("client# %s\n", msg);
			if (fork() == 0)
            {
				//child
				execlp(msg, msg, NULL); //进程程序替换
				exit(1);
			}
			waitpid(-1, NULL, 0);
        }
        else if (s == 0)
        {
			printf("client quit!\n");
			break;
		}
		else{
			printf("read error!\n");
			break;
		}
	}
	close(fd); //通信完毕，关闭命名管道文件;
    return 0;
}